﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

//struct Stu
//{
//	char name[20];
//	int age;
//	float socre;
//}s3, s4;//s3,s4是全局变量

//struct Stu
//{
//	char name[20];
//	int age;
//	float socre;
//};
//
//
//struct Stu s2;//全局变量
//
//int main()
//{
//	struct Stu s1 = {"lisi", 20, 95.5f};//局部
//
//	return 0;
//}

//struct //匿名结构体类型
//{
//	int a;
//	char b;
//	float c;
//}s1,s2,s3;
//
//int main()
//{
//	//
//	return 0;
//}

//struct //匿名结构体类型
//{
//	int a;
//	char b;
//	float c;
//}s1;
//
//struct //匿名结构体类型
//{
//	int a;
//	char b;
//	float c;
//}* ps;
//
//int main()
//{
//	ps = &s1;//no
//	return 0;
//}

//struct Node
//{
//	int data;
//	struct Node* next;
//};

//typedef struct Node
//{
//	int data;
//	struct Node* next;
//} Node;

//int main()
//{
//	printf("%d\n", sizeof(struct Node));//?
//	return 0;
//}
//#include <stddef.h>
//
//struct S1
//{
//	char c1;//1
//	char c2;//1
//	int n;//4
//};//8
//
//struct S2
//{
//	char c1;//1
//	int n;//4
//	char c2;//1
//};//12
//
//int main()
//{
//	//struct S2 s2;
//	printf("%d\n", offsetof(struct S2, c1));//计算成员在起始位置的偏移量
//	printf("%d\n", offsetof(struct S2, n));
//	printf("%d\n", offsetof(struct S2, c2));
//
//	//printf("%zd\n", sizeof(struct S1));//?
//	//printf("%zd\n", sizeof(struct S2));//?
//
//	return 0;
//}

//struct S1
//{
//    char c1;//1
//    int i;//4
//    char c2;//1
//};
//
//struct S2
//{
//    char c1;//1
//    char c2;//1
//    int i;//4
//};
//
//struct S3
//{
//    double d;
//    char c;
//    int i;
//};
//
//struct S4
//{
//    char c1;
//    struct S3 s3; //嵌套的结构体成员
//    double d;
//};
//
//int main()
//{
//    struct S1 s1;
//    struct S2 s2;
//    struct S3 s3;
//    struct S4 s4;
//
//    printf("%zd\n", sizeof(struct S1));//12
//    printf("%zd\n", sizeof(struct S2));//8
//    printf("%zd\n", sizeof(struct S3));//16
//    printf("%zd\n", sizeof(struct S4));//    32
//
//	return 0;
//}

//#include <stdio.h>
//#pragma pack(1)//设置默认对⻬数为1
//struct S
//{
//	char c1;
//	int i;
//	char c2;
//};
//#pragma pack()//取消设置的对⻬数，还原为默认
//int main()
//{
//	//输出的结果是什么？
//	printf("%zd\n", sizeof(struct S));//6
//	return 0;
//}

//#include <stdio.h>
//#pragma pack(2)
//struct S
//{
//	char c1;//1 2 1
//	int i;//4 2 2
//	char c2;//1 2 1
//};
//#pragma pack()//取消设置的对⻬数，还原为默认
//int main()
//{
//	//输出的结果是什么？
//	printf("%zd\n", sizeof(struct S));//8
//	return 0;
//}

//struct S
//{
//    int data[1000];
//    int num;
//};
//
//void Print1(struct S t)
//{
//    int i = 0;
//    printf("Print1:");
//    for (i = 0; i < 5; i++)
//    {
//        printf("%d ", t.data[i]);
//    }
//    printf("%d\n", t.num);
//}
//
//void Print2(const struct S* ps)
//{
//    int i = 0;
//    printf("Print2:");
//    for (i = 0; i < 5; i++)
//    {
//        printf("%d ", ps->data[i]);//(*ps).data[i]
//    }
//    printf("%d\n", ps->num);
//}
//
//int main()
//{
//    struct S s = { {1,2,3,4,5}, 100 };
//    printf("%zd\n", sizeof(s));
//    Print1(s);//结构体的传参
//    Print2(&s);
//    return 0;
//}

//-------------------------------------
//位段  位段的空间上是按照需要以4个字节（ int ）或者1个字节（ char ）的⽅式来开辟的。
//结构体
//struct A1
//{
//    int _a;//0 1 2 3
//    int _b;
//    int _c;
//    int _d;
//};


//位段 - 位段时可以节省空间的
//struct A2
//{
//    int _a : 2;//4个字节 存了17bit 浪费15bit
//    int _b : 5;
//    int _c : 10;
//    int _d : 30;//4个字节 存了30bit 浪费2bit
//};
//
//
//int main()
//{
//    printf("%zd\n", sizeof(struct A1));//16
//    printf("%zd\n", sizeof(struct A2));//8
//    return 0;
//}


//3.位段中的成员在内存中从左向右分配，还是从右向左分配，标准尚未定义。  vs是从右向左分配
//4.当一个结构包含两个位段，第二个位段成员比较大，无法容纳于第一个位段剩余的位时，是舍弃剩余的位还是利用，这是不确定的。  vs是舍弃剩余的位
//struct S
//{
//    char a : 3;//指占3bit
//    char b : 4;
//    char c : 5;
//    char d : 4;
//};
//
//
//int main()
//{
//    struct S s = { 0 };
//    //printf("%zd\n", sizeof(struct S));//3
//    s.a = 10;
//    s.b = 12;
//    s.c = 3;
//    s.d = 4;
//
//	return 0;
//}


//struct A
//{
//    int _a : 2;//4个字节 存了17bit 浪费15bit
//    int _b : 5;
//    int _c : 10;
//    int _d : 30;//4个字节 存了30bit 浪费2bit
//};
//int main()
//{
//	struct A sa = { 0 };
//	scanf("%d", &sa._b);//这是错误的
//
//	//正确的⽰范
//	int b = 0;
//	scanf("%d", &b);
//	sa._b = b;
//	return 0;
//}